bitkeeper revision 1.356 (3f13f2c2PyTtgUQ-EMLCir5OE3cd1g)
authorrac61@labyrinth.cl.cam.ac.uk <rac61@labyrinth.cl.cam.ac.uk>
Tue, 15 Jul 2003 12:25:38 +0000 (12:25 +0000)
committerrac61@labyrinth.cl.cam.ac.uk <rac61@labyrinth.cl.cam.ac.uk>
Tue, 15 Jul 2003 12:25:38 +0000 (12:25 +0000)
Add support for usr= argument to xenctl domain new
Add better argument construction (ro if root is a disk)
Add automatic physical disk access grant if root/usr are disks

tools/control/src/org/xenoserver/cmdline/ParseDomainNew.java
tools/control/src/org/xenoserver/control/CommandDomainNew.java
tools/control/src/org/xenoserver/control/Defaults.java
tools/control/src/org/xenoserver/control/StringPattern.java

index 910ffc01ea886a245bd01d190a9e107a9efce6f5..ed75aa744d8bc067a44e1620b9357bad787838ee 100644 (file)
@@ -4,7 +4,10 @@ import java.util.LinkedList;
 
 import org.xenoserver.control.CommandDomainNew;
 import org.xenoserver.control.CommandFailedException;
+import org.xenoserver.control.CommandPhysicalGrant;
 import org.xenoserver.control.Defaults;
+import org.xenoserver.control.Mode;
+import org.xenoserver.control.StringPattern;
 
 public class ParseDomainNew extends CommandParser {
     public void parse(Defaults d, LinkedList args)
@@ -16,6 +19,7 @@ public class ParseDomainNew extends CommandParser {
         int vifs = getIntParameter(args, 'v', d.domainVIFs);
         String bargs = getStringParameter(args, 'a', d.args) + " ";
         String root_dev = getStringParameter(args, 'd', d.rootDevice);
+        String usr_dev = getStringParameter(args, 'u', d.usrDevice);
         String nfs_root_path = getStringParameter(args, 'f', d.nwNFSRoot);
         String nw_ip = getStringParameter(args, '4', d.nwIP);
         String nw_gw = getStringParameter(args, 'g', d.nwGateway);
@@ -40,12 +44,33 @@ public class ParseDomainNew extends CommandParser {
                 nw_gw,
                 nw_mask,
                 nw_nfs_server,
-                nw_host);
+                nw_host,
+                usr_dev);
         c.execute();
         String[] output = c.output();
         for (int i = 0; i < output.length; i++) {
             System.out.println(output[i]);
         }
+        
+        if (root_dev.startsWith("/dev/sda") || root_dev.startsWith("/dev/hda")) {
+            String real_root = StringPattern.parse(root_dev).resolve(c.domain_id());
+            String device = real_root.substring(real_root.indexOf('/',1)+1);
+            CommandPhysicalGrant cg = new CommandPhysicalGrant(d,c.domain_id(),device,Mode.READ_WRITE,false);
+            String output2 = cg.execute();
+            if ( output2 != null ) {
+                System.out.println(output2);
+            }
+        }
+        
+        if (usr_dev != null && (usr_dev.startsWith("/dev/sda")) || usr_dev.startsWith("/dev/hda")) {
+            String real_usr = StringPattern.parse(usr_dev).resolve(c.domain_id());
+            String device = real_usr.substring(real_usr.indexOf('/',1)+1);
+            CommandPhysicalGrant cg = new CommandPhysicalGrant(d,c.domain_id(),device,Mode.READ_ONLY,false);
+            String output2 = cg.execute();
+            if ( output2 != null ) {
+                System.out.println(output2);
+            }
+        }
     }
 
     public String getName() {
@@ -53,7 +78,7 @@ public class ParseDomainNew extends CommandParser {
     }
 
     public String getUsage() {
-        return "[-n<domain_name>] [-k<size>] [-i<image>] [-v<num_vifs>] [-r<initrd>] [-d<root_device>] [-f<nfs_root>] [-s<nfs_boot_server>] [-4<ipv4_boot_address>] [-g<ipv4_boot_gateway>] [-m<ipv4_boot_netmask>] [-h<hostname>] [-a<args>]";
+        return "[-n<domain_name>] [-k<size>] [-i<image>] [-v<num_vifs>] [-r<initrd>] [-d<root_device>] [-u<usr_device>] [-f<nfs_root>] [-s<nfs_boot_server>] [-4<ipv4_boot_address>] [-g<ipv4_boot_gateway>] [-m<ipv4_boot_netmask>] [-h<hostname>] [-a<args>]";
     }
 
     public String getHelpText() {
@@ -68,7 +93,8 @@ public class ParseDomainNew extends CommandParser {
             + "  -v  Number of VIFs                           domain_vifs\n"
             + "  -r  InitRD (if required)                     domain_init_rd\n"
             + "  -d  Root device (e.g /dev/nfs, /dev/hda3)    root_device\n"
-            + "  -a  Additional boot parameters\n"
+            + "  -u  Usr dev/path (e.g /dev/hda3, server:path)usr_device\n"
+            + "  -a  Additional boot parameters               args\n"
             + "\n"
             + "Networking options:\n"
             + "  -f  NFS root (if /dev/nfs specified)         nw_nfs_root\n"
index 8bb0c9be4435189c3146ae5af1631fb2112e4723..5600cd04daf852bb7273913574b0c30be5542dce 100644 (file)
@@ -31,6 +31,8 @@ public class CommandDomainNew extends Command {
     private String bargs;
     /** Root device */
     private String root_dev;
+    /** Usr device */
+    private String usr_dev;
     /** NFS root path */
     private String nfs_root_path;
     /** IP address */
@@ -45,6 +47,8 @@ public class CommandDomainNew extends Command {
     private String nw_host;
     /** Output from domain creation */
     private String[] output;
+    /** Domain ID created. */
+    private int domain_id;
 
     /**
      * @return Output from domain creation.
@@ -52,6 +56,13 @@ public class CommandDomainNew extends Command {
     public String[] output() {
         return output;
     }
+    
+    /**
+     * @return The domain id this command created.
+     */
+    public int domain_id() {
+        return domain_id;
+    }
 
     /**
      * Constructor for CommandDomainNew.
@@ -85,20 +96,40 @@ public class CommandDomainNew extends Command {
         String nw_mask,
         String nw_nfs_server,
         String nw_host) {
-        this.d = d;
-        this.name = name;
-        this.size = size;
-        this.image = image;
-        this.initrd = initrd;
-        this.vifs = vifs;
-        this.bargs = bargs;
-        this.root_dev = root_dev;
-        this.nfs_root_path = nfs_root_path;
-        this.nw_ip = nw_ip;
-        this.nw_gw = nw_gw;
-        this.nw_mask = nw_mask;
-        this.nw_nfs_server = nw_nfs_server;
-        this.nw_host = nw_host;
+        this(d,name,size,image,initrd,vifs,bargs,root_dev,nfs_root_path,nw_ip,nw_gw,nw_mask,nw_nfs_server,nw_host,null);
+    }
+    
+    public CommandDomainNew(
+        Defaults d,
+        String name,
+        int size,
+        String image,
+        String initrd,
+        int vifs,
+        String bargs,
+        String root_dev,
+        String nfs_root_path,
+        String nw_ip,
+        String nw_gw,
+        String nw_mask,
+        String nw_nfs_server,
+        String nw_host,
+        String usr_dev) {
+            this.d = d;
+            this.name = name;
+            this.size = size;
+            this.image = image;
+            this.initrd = initrd;
+            this.vifs = vifs;
+            this.bargs = bargs;
+            this.root_dev = root_dev;
+            this.nfs_root_path = nfs_root_path;
+            this.nw_ip = nw_ip;
+            this.nw_gw = nw_gw;
+            this.nw_mask = nw_mask;
+            this.nw_nfs_server = nw_nfs_server;
+            this.nw_host = nw_host;
+            this.usr_dev = usr_dev;
     }
 
     /**
@@ -189,9 +220,13 @@ public class CommandDomainNew extends Command {
                         (bargs
                             + " root="
                             + StringPattern.parse(root_dev).resolve(domain_id)
-                            + " ");
+                            + " ro ");
 
                 }
+                
+                if (usr_dev != null && !usr_dev.equals("")) {
+                    bargs = bargs + " usr=" + StringPattern.parse(usr_dev).resolve(domain_id) + " ";
+                }
 
                 if (vifs > 0) {
                     domain_ip =
@@ -316,6 +351,8 @@ public class CommandDomainNew extends Command {
                 output[5] += vifinit_cmdarray[i] + " ";
             }
         }
+        
+        this.domain_id = domain_id;
 
         return null;
     }
index 1fba5baeac86f7c36d050ef799c7023f718b4b2e..d180a3eb917697ad43a420175262cd3ea4fd8f32 100644 (file)
@@ -29,6 +29,8 @@ public class Defaults {
     public int domainVIFs;
     /** Default root device. */
     public String rootDevice;
+    /** Default usr device. */
+    public String usrDevice;
     /** Default IP address pattern. */
     public String nwIP;
     /** Default gateway pattern. */
@@ -84,6 +86,7 @@ public class Defaults {
         System.out.println("   domainImage     " + domainImage);
         System.out.println("   domainInitRD    " + domainInitRD);
         System.out.println("   rootDevice      " + rootDevice);
+        System.out.println("   usrDevice       " + usrDevice);
         System.out.println("   NWIP            " + nwIP);
         System.out.println("   NWGW            " + nwGateway);
         System.out.println("   NWMask          " + nwMask);
@@ -146,6 +149,8 @@ public class Defaults {
                     domainVIFs = Integer.parseInt(s);
                 } else if (lastName.equals("root_device")) {
                     rootDevice = s;
+                } else if (lastName.equals("usr_device")) {
+                    usrDevice = s;
                 } else if (lastName.equals("nw_ip")) {
                     nwIP =
                         expandDefault(
index 111a5271fae6572a0af2fa2624f1a2c3bca0699a..664bff0013bd88d2adc368f9708b6813c8214fe8 100644 (file)
@@ -18,7 +18,7 @@ public class StringPattern {
      * @param t The pattern string to parse.
      * @return A usable pattern object.
      */
-    static StringPattern parse(String t) {
+    public static StringPattern parse(String t) {
         StringPattern result = new StringPattern();
         char[] ca = t.toCharArray();
         int idx = 0;
@@ -53,7 +53,7 @@ public class StringPattern {
      * @param domain The domain number to use.
      * @return The expanded pattern for the given domain.
      */
-    String resolve(int domain) {
+    public String resolve(int domain) {
         if (addDom) {
             return base + (bn + domain);
         } else if (appendDom) {